package cn.uin.domain.auth.adapter.repository;

import cn.uin.domain.auth.model.aggregate.UserInfoAggregate;
import cn.uin.domain.auth.model.entity.*;

import java.util.List;
import java.util.Map;

/**
 * @Auther: uIn
 * @Date: 2025/10/19 - 10 - 19 - 16:45
 * @Description: 认证服务(依赖倒置-获取基础设施层数据)
 * @version: 1.0
 */
public interface IAuthRepository {

    /**
     * 根据用户名获取用户信息
     * @param username
     * @return
     */
    HomeUserEntity queryUserByUserName(String username);

    /**
     * 根据手机号获取用户信息
     * @param phone
     * @return
     */
    HomeUserEntity queryUserByUserPhone(String phone);

    /**
     * 根据邮箱获取用户信息
     * @param email
     * @return
     */
    HomeUserEntity queryUserByUserEmail(String email);

    /**
     * 新增用户信息
     * @param homeUserRegisterEntity
     */
    void saveUser(HomeUserRegisterEntity homeUserRegisterEntity);

    /**
     * 根据用户名获取角色信息
     * @param username
     * @return
     */
    List<HomeRoleEntity> queryRolesByUserName(String username);

    /**
     * 根据用户名获取菜单信息
     * @param username
     * @return
     */
    List<HomeMenuEntity> queryMenusByUserName(String username);

    /**
     * 根据角色id获取菜单信息
     * @param roleId
     * @return
     */
    List<HomeMenuEntity> queryMenusByRoleId(Long roleId);

    /**
     * 生成并保存token到redis
     * @param username
     * @param Claims
     */
    String saveUserToken(String username, Map<String, Object> Claims);

    /**
     * 校验token
     * @return
     */
    boolean checkToken(String username, String tokenHeader);

    /**
     * 校验验证码
     * @param key
     * @param code
     * @return
     */
    boolean checkCode(String key, String code);

    /**
     * 保存用户登录日志
     * @param loginLogEntity
     */
    void saveLoginLog(LoginLogEntity loginLogEntity);

    /**
     * 根据用户id查询详细信息
     * @param userId
     * @return
     */
    UserInfoAggregate queryByUserId(Long userId);

    /**
     * 保存用户详细信息
     * @param homeUserDetailEntity
     */
    void saveUserDetail(HomeUserDetailEntity homeUserDetailEntity);

    /**
     * 编辑用户详细信息
     * @param homeUserDetailEntity
     */
    void editUserDetail(HomeUserDetailEntity homeUserDetailEntity);
}
